Contravariant Functor
#cats
#型クラス
概要
contramapは、変換を表すデータ型に対してのみ意味がある
Functorが変換をF[A]の後に繋げていくのに対し、F[A]に来るまでに(ゴールはF[A]に決まっている)変換を繋げる
contramap that represents “prepending” an operation to a chain
https://gyazo.com/3411147c43a0ad113a2792b07a251789
直感)Aを変換するような作用のFがあったとして、B=>Aがある場合はF[B]だとしてもF[A]に到着できるよね
showがContravariantになる理由
Show[Hoge]インスタンスがあるとして、Fuga=>Hogeな変換があるとしたら、Show[Fuga]でもshow(変換)できるよね
条件
contramap
contramap[A, B](fa: F[A])(f: B => A): F[B]
例
Function1
Show
cats.kernel.Order
Scala
code:scala
trait Contravariant[F_] extends InvariantF { self =>
def contramapA, B(fa: FA)(f: B => A): FB
override def imapA, B(fa: FA)(f: A => B)(fi: B => A): FB = contramap(fa)(fi)
}
code:scala
case class Money(amount: Int)
case class Salary(size: Money)
implicit val showMoney: ShowMoney = Show.show(m => s"$$${m.amount}")
implicit val showSalary: ShowSalary = showMoney.contramap(_.size)
code:scala
trait ShowA { self =>
def show(value: A): String
def contramapB(func: B => A): ShowB =
new ShowB {
def show(value: B): String =
self.show(func(value))
}
}